﻿-------------------------------------------------------------------------------
-- Подсветка табуляции и перевода строк. © SimSU
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Editor_ShowWhiteSpace.cfg
return{
  Enable=true; --Разрешить подсветку табуляции и перевода строк.
  TB=0x90; --Цвет символов табуляции.
  CR=0x80; --Цвет символа возврата корретки.
  LF=0x90; --Цвет символа перевода корретки.
  EF=0x40; --Цвет конца файла.

  Key="ScrollLock"; --Prior=50;
}
-- Конец файла Profile\SimSU\Editor_ShowWhiteSpace.cfg
end

---- Локализация
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\Editor_ShowWhiteSpaceRussian.lng
return{
  Descr="Подсветка табуляции и перевода строк. © SimSU";
}
-- Конец файла Profile\SimSU\Editor_ShowWhiteSpaceRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Editor_ShowWhiteSpaceEnglish.lng
return{
  Descr="Подсветка табуляции и перевода строк. © SimSU";
}
-- End of file Profile\SimSU\Editor_ShowWhiteSpaceEnglish.lng
end end

local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_ShowWhiteSpace"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Editor_ShowWhiteSpace.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Editor_ShowWhiteSpace.cfg") or Settings)()

local SimSU=SimSU or {}
SimSU.Editor_ShowWhiteSpace={}
-------------------------------------------------------------------------------
local F=far.Flags
local GUID="9A805A14-A576-43C4-8389-24670CCE5D81"
local Enable=S.Enable or true
local TB,CR,LF,EF = S.TB or 0x90, S.CR or 0x80, S.LF or 0x90, S.EF or 0x40

function SimSU.Editor_ShowWhiteSpace.Switch()
  Enable=not Enable
  if not Enable then
    for i=1,far.AdvControl(F.ACTL_GETWINDOWCOUNT,0,0) do
      local Inf=far.AdvControl(F.ACTL_GETWINDOWINFO,i,0)
      if Inf and Inf.Type==F.WTYPE_EDITOR then
        Inf=editor.GetInfo(Inf.Id)
        for j=1,Inf.TotalLines do
          editor.DelColor(Inf.EditorID,j,nil,GUID)
        end
      end
    end
  end
end

function SimSU.Editor_ShowWhiteSpace.Show(id,event,param)
  local Inf=editor.GetInfo()
  local Beg=Inf.TopScreenLine
  local End=math.min(Inf.TotalLines,Inf.TopScreenLine+Inf.WindowSizeY-1)
  local Left,Right = Inf.LeftPos, Inf.LeftPos+Inf.WindowSizeX
  for i=Beg,End do
    local Str=editor.GetString(Inf.EditorID,i,0)
    editor.DelColor(Inf.EditorID,i,nil,GUID)
    --EOL
    local EOL=Str.StringEOL
    if EOL:sub(1,1)=="\r" then
      editor.AddColor(Inf.EditorID,i,Str.StringLength+1,Str.StringLength+1,nil,CR,F.EDITOR_COLOR_NORMAL_PRIORITY,GUID)
      if EOL:sub(2,2)=="\n" then
        editor.AddColor(Inf.EditorID,i,Str.StringLength+2,Str.StringLength+2,nil,LF,F.EDITOR_COLOR_NORMAL_PRIORITY,GUID)
      end
    elseif EOL:sub(1,1)=="\n" then
      editor.AddColor(Inf.EditorID,i,Str.StringLength+1,Str.StringLength+1,nil,LF,F.EDITOR_COLOR_NORMAL_PRIORITY,GUID)
    elseif EOL=="" then
      editor.AddColor(Inf.EditorID,i,Str.StringLength+1,Str.StringLength+1,nil,EF,F.EDITOR_COLOR_NORMAL_PRIORITY,GUID)
    end
    --TAB
    local S=Str.StringText
    local j,k=0,0
    while j do
      j=S:find("\t",j+1)
      if j then
        k=string.sub(S,1,j):len()
        editor.AddColor(Inf.EditorID,i,k,k,nil,TB,F.EDITOR_COLOR_NORMAL_PRIORITY,GUID)
      end
    end
  end
end

-------------------------------------------------------------------------------
if not Macro then return {Editor_ShowWhiteSpace=SimSU.Editor_ShowWhiteSpace} end

local ok, mod = pcall(require,"SimSU.Editor_ShowWhiteSpace"); if ok then SimSU=mod else _G.SimSU=SimSU end
-------------------------------------------------------------------------------

Macro {area="Editor"; key=S.Key; priority=S.Prior; description=M.Descr; flags="EnableOutput";
  action=SimSU.Editor_ShowWhiteSpace.Switch;
}
Event {group="EditorEvent"; priority=S.Prior; description=M.Descr;
  condition=function(Id,Event,Param) return Enable and Event==F.EE_REDRAW end;
  action=SimSU.Editor_ShowWhiteSpace.Show;
}
